package com.fau.cm.aop;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import com.fau.cm.dao.IBaseDao;
import com.fau.cm.entity.MedicalAdmin;
import com.fau.cm.entity.MedicalCallCheck;
import com.fau.cm.entity.MedicalCallPerforAnalysis;
import com.fau.cm.entity.MedicalCallTaskStatistics;
import com.fau.cm.entity.MedicalCallUntreated;
import com.fau.cm.entity.MedicalMediaInfoCosts;
import com.fau.cm.entity.MedicalOrders;
import com.fau.cm.entity.MedicalOrdersLog;
import com.fau.cm.entity.MedicalOrdersProduct;
import com.fau.cm.entity.MedicalOrdersStorage;
import com.fau.cm.util.SystemConfig;

/**
 * @desc 话务员绩效考核Aop、任务统计
 * @author dangjh
 * @datetime 2014年12月11日 下午4:45:18
 */
@Aspect
@Component
public class PerformAppraisalAop {

	@Resource
	private IBaseDao iBaseDao;
	
	/**-----------------------------------------------------------------------话务任务分配切点----------------------------------------------------
	 * @desc 话务任务分配切点
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:21:46
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallManagerServiceImpl.callAllocate(..))")
	private void callAllocate() {}
	
	/**
	 * @desc 中心话务任务分配切点
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:22:04
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallCenterManagerServiceImpl.callAllocate(..))")
	private void callCenterAllocate() {}
	
	/**
	 * @desc 组话务任务分配切点
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:22:20
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallGroupManagerServiceImpl.callAllocate(..))")
	private void callGroupAllocate() {}
	
	/**
	 * @desc 来电弹屏直接保存到话务员切点
	 * @author kangyj
	 * @datetime 2015年3月13日,上午10:23:16
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallManagerServiceImpl.incomsaveCall(..))")
	private void callPopupSave() {}
	
	/**
	 * @desc 来电弹屏直接任务直接保存到话务员
	 * @param joinPoint
	 * @param retVal
	 * @author kangyj
	 * @datetime 2015年3月13日,上午10:23:52
	 */
	@AfterReturning(value = "callPopupSave()", returning = "retVal")
	public void callPopupSave(JoinPoint joinPoint, String retVal) {
		String category = retVal.substring(0, retVal.lastIndexOf("|"));
		String callId = retVal.substring(retVal.lastIndexOf("|") + 1);
		if(StringUtils.isNotBlank(category) && SystemConfig.CALL_TASK_UNTREATED.equals(category)) {
			MedicalCallUntreated callUnt = (MedicalCallUntreated) this.iBaseDao.getObject(MedicalCallUntreated.class, callId);
			
			MedicalAdmin admin = (MedicalAdmin) this.iBaseDao.getObject(MedicalAdmin.class, callUnt.getHandleUserId());
			
			// 人资系统-话务员绩效考核
			MedicalCallCheck callCheck = new MedicalCallCheck();
			callCheck.setUser(admin);
			callCheck.setTaskId(callUnt.getId());
			callCheck.setStatus(SystemConfig.CALL_TASK_UNTREATED);
			callCheck.setEid(callUnt.getHospitalId());
			this.iBaseDao.saveObject(callCheck);
			
			// 话务系统-话务员任务统计
			MedicalCallTaskStatistics taskSta = new MedicalCallTaskStatistics();
			taskSta.setHandleUserId(callUnt.getHandleUserId());
			taskSta.setTaskType(SystemConfig.CALL_TASK_UNTREATED);
			taskSta.setTaskId(callUnt.getId());
			taskSta.setHospitalId(callUnt.getHospitalId());
			taskSta.setTaskTime(callUnt.getAllocationTime());
			this.iBaseDao.saveObject(taskSta);
		}
	}
	
	/**
	 * @desc 保存话务员绩效考核数据——部门
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:10:18
	 */
	@AfterReturning("callAllocate()")
	public void allocate(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String tasksId = (String) obj[0];
		this.allocation(tasksId);
	}
	
	/**
	 * @desc 保存话务员绩效考核数据——中心
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:10:18
	 */
	@AfterReturning("callCenterAllocate()")
	public void allocateCenter(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String tasksId = (String) obj[0];
		this.allocation(tasksId);
	}
	
	/**
	 * @desc 保存话务员绩效考核数据——组
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:10:18
	 */
	@AfterReturning("callGroupAllocate()")
	public void allocateGroup(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String tasksId = (String) obj[0];
		this.allocation(tasksId);
	}
	
	/**
	 * @desc 话务任务分配
	 * @param orderIds
	 * @author dangjh
	 * @datetime 2014年12月12日 上午1:09:39
	 */
	private void allocation(String tasksId) {
		String[] ids = tasksId.split(",");
		for(String id : ids) {
			MedicalCallUntreated call = (MedicalCallUntreated) this.iBaseDao.getObject(MedicalCallUntreated.class, id);
			if(null != call) {
				MedicalAdmin admin = (MedicalAdmin) this.iBaseDao.getObject(MedicalAdmin.class, call.getHandleUserId());
				// 人资系统-话务员绩效考核
				MedicalCallCheck callCheck = new MedicalCallCheck();
				callCheck.setUser(admin);
				callCheck.setTaskId(call.getId());
				callCheck.setStatus(SystemConfig.CALL_TASK_UNTREATED);
				callCheck.setEid(call.getHospitalId());
				this.iBaseDao.saveObject(callCheck);
				
				// 话务系统-话务员任务统计
				MedicalCallTaskStatistics taskSta = new MedicalCallTaskStatistics();
				taskSta.setHandleUserId(call.getHandleUserId());
				taskSta.setTaskType(SystemConfig.CALL_TASK_UNTREATED);
				taskSta.setTaskId(call.getId());
				taskSta.setHospitalId(call.getHospitalId());
				taskSta.setTaskTime(call.getAllocationTime());
				this.iBaseDao.saveObject(taskSta);
			}
		}
	}
	
	/**-----------------------------------------------------------------------处理话务任务切点----------------------------------------------------
	 * @desc 处理话务任务切点——未处理
	 * @author dangjh
	 * @datetime 2014年12月12日 上午10:41:18
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallMyManagerServiceImpl.editCallUntreatedSta(..))")
	private void editCallUntreatedSta() {}
	
	/**
	 * @desc 处理话务任务切点——待处理
	 * @author dangjh
	 * @datetime 2014年12月12日 上午10:41:18
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallMyManagerServiceImpl.editCallPendingSta(..))")
	private void editCallPendingSta() {}
	
	/**
	 * @desc 打开任务界面修改任务状态
	 * @author dangjh
	 * 2015年3月8日 下午4:51:52
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallMyManagerServiceImpl.editCallStatus(..))")
	private void editCallStatus() {}
	
	/**
	 * @desc 话务员绩效考核通过——未处理任务
	 * @author dangjh
	 * @datetime 2014年12月11日 下午4:47:20
	 */
	@AfterReturning("editCallUntreatedSta()")
	public void callUntreatedSta(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		String statusKey = (String) obj[1];
		String handleUserId = (String) obj[3];
		String[] ids = callIds.split(",");
		for(String id : ids) {
			MedicalCallCheck callCheck = (MedicalCallCheck) this.iBaseDao.getObjectByHql("from MedicalCallCheck m where m.taskId = ? ", id);
			if(SystemConfig.CALL_TASK_PENDING.equals(statusKey)) {
				// 人资系统-话务员绩效考核
				callCheck.setStatus(SystemConfig.CALL_TASK_PENDING);
				this.iBaseDao.saveObject(callCheck);
				
				// 话务系统-话务员修改任务状态
				this.iBaseDao.updateHql("update MedicalCallTaskStatistics m set m.taskType = ? where m.taskId = ? and m.taskType = ? ", 
						SystemConfig.CALL_TASK_PENDING, id, SystemConfig.CALL_TASK_UNTREATED);
			} else if(SystemConfig.CALL_TASK_END.equals(statusKey)) {
				// 人资系统-话务员绩效考核
				callCheck.setStatus(SystemConfig.CALL_TASK_END);
				this.iBaseDao.saveObject(callCheck);
				
				// 话务系统-话务员修改任务状态
				this.iBaseDao.updateHql("update MedicalCallTaskStatistics m set m.taskType = ? where m.taskId = ? and m.taskType = ? ", 
						SystemConfig.CALL_TASK_END, id, SystemConfig.CALL_TASK_UNTREATED);
			} else if(SystemConfig.CALL_TASK_TRANSFER.equals(statusKey)) {
				// 任务转移，转到另一个人的未处理任务中
				// 删除转移人，绩效
				this.iBaseDao.updateHql("delete from MedicalCallCheck m where m.taskId = ? and m.status <> ? ", id, SystemConfig.CALL_TASK_END);
				this.iBaseDao.updateHql("delete from MedicalCallTaskStatistics m where m.taskId = ? and m.taskType <> ? ", id, SystemConfig.CALL_TASK_END);
				MedicalAdmin admin = (MedicalAdmin) this.iBaseDao.getObject(MedicalAdmin.class, handleUserId);
				// 人资系统-话务员绩效考核
				MedicalCallCheck bean = new MedicalCallCheck();
				bean.setUser(admin);
				bean.setTaskId(id);
				bean.setStatus(SystemConfig.CALL_TASK_UNTREATED);
				bean.setEid(admin.getEnterpriseId());
				this.iBaseDao.saveObject(bean);
				
				// 话务系统-话务员任务统计
				MedicalCallTaskStatistics taskSta = new MedicalCallTaskStatistics();
				taskSta.setHandleUserId(handleUserId);
				taskSta.setHandUserName(admin.getName());
				taskSta.setTaskType(SystemConfig.CALL_TASK_UNTREATED);
				taskSta.setTaskId(id);
				taskSta.setHospitalId(admin.getEnterpriseId());
				taskSta.setTaskTime(new Date());	// 此处为创建时间
				this.iBaseDao.saveObject(taskSta);
			}
		}
	}
	
	/**
	 * @desc 话务员绩效考核通过——待处理任务
	 * @param joinPoint
	 * @author dangjh
	 * 2014年12月31日 上午12:31:25
	 */
	@AfterReturning("editCallPendingSta()")
	public void editCallPendingSta(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		String statusKey = (String) obj[1];
		String handleUserId = (String) obj[3];
		String[] ids = callIds.split(",");
		for(String id : ids) {
			MedicalCallCheck callCheck = (MedicalCallCheck) this.iBaseDao.getObjectByHql("from MedicalCallCheck m where m.taskId = ? ", id);
			if(SystemConfig.CALL_TASK_END.equals(statusKey)) {
				// 人资系统-话务员绩效考核
				callCheck.setStatus(SystemConfig.CALL_TASK_END);
				this.iBaseDao.saveObject(callCheck);
				
				// 话务系统-话务员修改任务状态
				this.iBaseDao.updateHql("update MedicalCallTaskStatistics m set m.taskType = ? where m.taskId = ? and m.taskType = ? ", 
						SystemConfig.CALL_TASK_END, id, SystemConfig.CALL_TASK_PENDING);
			} else if(SystemConfig.CALL_TASK_TRANSFER.equals(statusKey)) {
				// 任务转移，转到另一个人的未处理任务中
				// 删除转移人，绩效
				this.iBaseDao.updateHql("delete from MedicalCallCheck m where m.taskId = ? and m.status <> ? ", id, SystemConfig.CALL_TASK_END);
				this.iBaseDao.updateHql("delete from MedicalCallTaskStatistics m where m.taskId = ? and m.taskType <> ? ", id, SystemConfig.CALL_TASK_END);
				MedicalAdmin admin = (MedicalAdmin) this.iBaseDao.getObjectByHql("from MedicalAdmin m where m.id = ? ", handleUserId);
				// 人资系统-话务员绩效考核
				MedicalCallCheck bean = new MedicalCallCheck();
				bean.setUser(admin);
				bean.setTaskId(id);
				bean.setStatus(SystemConfig.CALL_TASK_UNTREATED);
				bean.setEid(admin.getEnterpriseId());
				this.iBaseDao.saveObject(bean);
				
				// 话务系统-话务员任务统计
				MedicalCallTaskStatistics taskSta = new MedicalCallTaskStatistics();
				taskSta.setHandleUserId(handleUserId);
				taskSta.setHandUserName(admin.getName());
				taskSta.setTaskType(SystemConfig.CALL_TASK_UNTREATED);
				taskSta.setTaskId(id);
				taskSta.setHospitalId(admin.getEnterpriseId());
				taskSta.setTaskTime(new Date());	// 此处为创建时间
				this.iBaseDao.saveObject(taskSta);
			}
		}
	}
	
	/**
	 * @desc 话务员绩效考核-打开任务界面修改任务状态
	 * @param joinPoint
	 * @author dangjh
	 * 2015年3月8日 下午4:53:48
	 */
	@AfterReturning("editCallStatus()")
	public void editCallStatus(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		MedicalAdmin userArg = (MedicalAdmin) obj[0];
		MedicalCallUntreated callUnt = (MedicalCallUntreated) obj[1];
		MedicalCallCheck callCheck = (MedicalCallCheck) this.iBaseDao.getObjectByHql("from MedicalCallCheck m where m.taskId = ? ", callUnt.getId());
		if(SystemConfig.CALL_TASK_UNTREATED.equals(callUnt.getCallStatus())) {
			if(SystemConfig.CALL_TASK_PENDING.equals(callUnt.getStatusKey())) {
				// 人资系统-话务员绩效考核
				callCheck.setStatus(SystemConfig.CALL_TASK_PENDING);
				this.iBaseDao.saveObject(callCheck);
				
				// 话务系统-话务员修改任务状态
				this.iBaseDao.updateHql("update MedicalCallTaskStatistics m set m.taskType = ? where m.taskId = ? and m.taskType = ? ", 
						SystemConfig.CALL_TASK_PENDING, callUnt.getId(), SystemConfig.CALL_TASK_UNTREATED);
			} else if(SystemConfig.CALL_TASK_END.equals(callUnt.getStatusKey())) {
				// 人资系统-话务员绩效考核
				callCheck.setStatus(SystemConfig.CALL_TASK_END);
				this.iBaseDao.saveObject(callCheck);
				
				// 话务系统-话务员修改任务状态
				this.iBaseDao.updateHql("update MedicalCallTaskStatistics m set m.taskType = ? where m.taskId = ? and m.taskType = ? ", 
						SystemConfig.CALL_TASK_END, callUnt.getId(), SystemConfig.CALL_TASK_UNTREATED);
			} else if(SystemConfig.CALL_TASK_TRANSFER.equals(callUnt.getStatusKey())) {
				// 任务转移，转到另一个人的未处理任务中
				// 删除转移人，绩效
				this.iBaseDao.updateHql("delete from MedicalCallCheck m where m.taskId = ? and m.status <> ? ", callUnt.getId(), SystemConfig.CALL_TASK_END);
				this.iBaseDao.updateHql("delete from MedicalCallTaskStatistics m where m.taskId = ? and m.taskType <> ? ", callUnt.getId(), SystemConfig.CALL_TASK_END);
				MedicalAdmin admin = (MedicalAdmin) this.iBaseDao.getObject(MedicalAdmin.class, callUnt.getHandleUserId());
				// 人资系统-话务员绩效考核
				MedicalCallCheck bean = new MedicalCallCheck();
				bean.setUser(admin);
				bean.setTaskId(callUnt.getId());
				bean.setStatus(SystemConfig.CALL_TASK_UNTREATED);
				bean.setEid(admin.getEnterpriseId());
				this.iBaseDao.saveObject(bean);
				
				// 话务系统-话务员任务统计
				MedicalCallTaskStatistics taskSta = new MedicalCallTaskStatistics();
				taskSta.setHandleUserId(userArg.getId());
				taskSta.setHandUserName(userArg.getUsername());
				taskSta.setTaskType(SystemConfig.CALL_TASK_UNTREATED);
				taskSta.setTaskId(callUnt.getId());
				taskSta.setHospitalId(userArg.getEnterpriseId());
				taskSta.setTaskTime(new Date());	// 此处为创建时间
				this.iBaseDao.saveObject(taskSta);
			}
		} else if(SystemConfig.CALL_TASK_PENDING.equals(callUnt.getCallStatus())) {	
			if(SystemConfig.CALL_TASK_END.equals(callUnt.getStatusKey())) {
				// 人资系统-话务员绩效考核
				callCheck.setStatus(SystemConfig.CALL_TASK_END);
				this.iBaseDao.saveObject(callCheck);
				
				// 话务系统-话务员修改任务状态
				this.iBaseDao.updateHql("update MedicalCallTaskStatistics m set m.taskType = ? where m.taskId = ? and m.taskType = ? ", 
						SystemConfig.CALL_TASK_END, callUnt.getId(), SystemConfig.CALL_TASK_PENDING);
			} else if(SystemConfig.CALL_TASK_TRANSFER.equals(callUnt.getStatusKey())) {
				// 任务转移，转到另一个人的未处理任务中
				// 删除转移人，绩效
				this.iBaseDao.updateHql("delete from MedicalCallCheck m where m.taskId = ? and m.status <> ? ", callUnt.getId(), SystemConfig.CALL_TASK_END);
				this.iBaseDao.updateHql("delete from MedicalCallTaskStatistics m where m.taskId = ? and m.taskType <> ? ", callUnt.getId(), SystemConfig.CALL_TASK_END);
				MedicalAdmin admin = (MedicalAdmin) this.iBaseDao.getObjectByHql("from MedicalAdmin m where m.id = ? ", callUnt.getHandleUserId());
				// 人资系统-话务员绩效考核
				MedicalCallCheck bean = new MedicalCallCheck();
				bean.setUser(admin);
				bean.setTaskId(callUnt.getId());
				bean.setStatus(SystemConfig.CALL_TASK_UNTREATED);
				bean.setEid(admin.getEnterpriseId());
				this.iBaseDao.saveObject(bean);
				
				// 话务系统-话务员任务统计
				MedicalCallTaskStatistics taskSta = new MedicalCallTaskStatistics();
				taskSta.setHandleUserId(userArg.getId());
				taskSta.setHandUserName(userArg.getUsername());
				taskSta.setTaskType(SystemConfig.CALL_TASK_UNTREATED);
				taskSta.setTaskId(callUnt.getId());
				taskSta.setHospitalId(userArg.getEnterpriseId());
				taskSta.setTaskTime(new Date());	// 此处为创建时间
				this.iBaseDao.saveObject(taskSta);
			}
		}
	}
	
	/**-----------------------------------------------------------------------回收话务任务切点----------------------------------------------------
	 * @desc 回收切点——未分配
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:23:09
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallManagerServiceImpl.recoverUnaCall(..))")
	private void recoverUnaCall() {}
	
	/**
	 * @desc 回收切点——未处理
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:23:09
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallManagerServiceImpl.recoverUntCall(..))")
	private void recoverUntCall() {}
	
	/**
	 * @desc 回收切点——待处理
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:23:09
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallManagerServiceImpl.recoverPenCall(..))")
	private void recoverPenCall() {}
	
	/**
	 * @desc 中心回收切点——未分配
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:23:09
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallCenterManagerServiceImpl.recoverUnaCall(..))")
	private void recoverCenterUnaCall() {}
	
	/**
	 * @desc 中心回收切点——未处理
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:23:09
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallCenterManagerServiceImpl.recoverUntCall(..))")
	private void recoverCenterUntCall() {}
	
	/**
	 * @desc 中心回收切点——待处理
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:23:09
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallCenterManagerServiceImpl.recoverPenCall(..))")
	private void recoverCenterPenCall() {}
	
	/**
	 * @desc 组回收切点——未处理
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:23:09
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallGroupManagerServiceImpl.recoverUntCall(..))")
	private void recoverGroupUntCall() {}
	
	/**
	 * @desc 组回收切点——待处理
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:23:09
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.CallGroupManagerServiceImpl.recoverPenCall(..))")
	private void recoverGroupPenCall() {}
	
	/**
	 * @desc 回收切点——未分配
	 * @param joinPoint
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:52:02
	 */
	@AfterReturning("recoverUnaCall()")
	public void recoverOper(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		this.back(callIds);
	}
	
	/**
	 * @desc 回收切点——未处理
	 * @param joinPoint
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:52:02
	 */
	@AfterReturning("recoverUntCall()")
	public void recoverOperate(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		this.back(callIds);
	}
	
	/**
	 * @desc 回收切点——待处理
	 * @param joinPoint
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:52:02
	 */
	@AfterReturning("recoverPenCall()")
	public void recoverOperates(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		this.back(callIds);
	}
	
	/**
	 * @desc 中心回收切点——未分配
	 * @param joinPoint
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:52:02
	 */
	@AfterReturning("recoverCenterUnaCall()")
	public void centerRecoverOper(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		this.back(callIds);
	}
	
	/**
	 * @desc 中心回收切点——未处理
	 * @param joinPoint
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:52:02
	 */
	@AfterReturning("recoverCenterUntCall()")
	public void centerRecoverOperate(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		this.back(callIds);
	}
	
	/**
	 * @desc 中心回收切点——待处理
	 * @param joinPoint
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:52:02
	 */
	@AfterReturning("recoverCenterPenCall()")
	public void centerRecoverOperates(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		this.back(callIds);
	}
	
	/**
	 * @desc 组回收切点——未处理
	 * @param joinPoint
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:52:02
	 */
	@AfterReturning("recoverGroupUntCall()")
	public void groupRecoverOperate(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		this.back(callIds);
	}
	
	/**
	 * @desc 组回收切点——待处理
	 * @param joinPoint
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:52:02
	 */
	@AfterReturning("recoverGroupPenCall()")
	public void groupRecoverOperates(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		String callIds = (String) obj[0];
		this.back(callIds);
	}
	
	/**-----------------------------------------------------------------------保存切点----------------------------------------------------
	 * @desc 保存订单切点
	 * @author dangjh
	 * 2015年1月12日 上午11:50:17
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.OrdersManagerServiceImpl.saveOrders(..))")
	private void saveOrders() {}
	
	/**
	 * @desc 保存订单
	 * @param joinPoint
	 * @author dangjh
	 * 2015年1月12日 上午11:51:38
	 */
	@AfterReturning("saveOrders()")
	public void saveOrders(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		MedicalOrders orders = (MedicalOrders) obj[0];
		MedicalAdmin admin = (MedicalAdmin) obj[1];
		MedicalOrdersLog log = new MedicalOrdersLog();
		log.setOrderNo(orders.getSerialNum());
		log.setName(admin.getName());
		log.setUserName(admin.getUsername());
		log.setContent("成功保存订单信息");
		log.setEid(admin.getEnterpriseId());
		this.iBaseDao.saveObject(log);
	}
	
	/**
	 * @desc 修改订单切点
	 * @author dangjh
	 * 2015年1月12日 上午11:50:17
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.OrdersManagerServiceImpl.editOrdersStorage(..))")
	private void editOrdersStorage() {}
	
	/**
	 * @desc 修改订单
	 * @param joinPoint
	 * @author dangjh
	 * 2015年1月12日 上午11:51:38
	 */
	@AfterReturning("editOrdersStorage()")
	public void editOrdersStorage(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		MedicalOrders orders = (MedicalOrders) obj[0];
		MedicalOrdersStorage bean = (MedicalOrdersStorage) this.iBaseDao.getObject(MedicalOrdersStorage.class, orders.getId());
		
		if(!SystemConfig.ORDERS_AUDIT_CANCEL_TYPE.equals(bean.getOrdersStatus()) || 
				!SystemConfig.ORDERS_AUDIT_NOPASS_TYPE.equals(bean.getOrdersStatus())) {
			
			MedicalAdmin admin = (MedicalAdmin) this.iBaseDao.getObject(MedicalAdmin.class, bean.getCusSerId());
			
			MedicalOrdersLog log = new MedicalOrdersLog();
			log.setOrderNo(bean.getSerialNum());
			log.setName(admin.getName());
			log.setUserName(admin.getUsername());
			log.setContent("成功修改订单信息,应收金额"+bean.getReceivable()+"实收金额"+bean.getAmountPaid()+"使用积分"+bean.getUsePoints()+"本单积分"+bean.getPoints()+"使用红包"+bean.getUseRed()+"本单红包"+bean.getRed());
			log.setEid(admin.getEnterpriseId());
			this.iBaseDao.saveObject(log);
		}
	}
	
	/**
	 * @desc 订单再次提交审核切点
	 * @author dangjh
	 * 2015年1月12日 上午11:50:17
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.OrdersManagerServiceImpl.againSubmit(..))")
	private void againSubmit() {}
	
	/**
	 * @desc 订单再次提交审核
	 * @param joinPoint
	 * @author dangjh
	 * 2015年1月12日 上午11:51:38
	 */
	@AfterReturning("againSubmit()")
	public void againSubmit(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		MedicalOrders orders = (MedicalOrders) obj[0];
		MedicalOrdersStorage ordersStorage = (MedicalOrdersStorage) this.iBaseDao.getObject(MedicalOrdersStorage.class, orders.getId());
		MedicalAdmin admin = (MedicalAdmin) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		MedicalOrdersLog log = new MedicalOrdersLog();
		log.setOrderNo(ordersStorage.getSerialNum());
		log.setName(admin.getName());
		log.setUserName(admin.getUsername());
		log.setContent("订单再次提交审核");
		log.setEid(admin.getEnterpriseId());
		this.iBaseDao.saveObject(log);
		
//		if(SystemConfig.ORDERS_AUDIT_INVALID_TYPE.equals(ordersStorage.getOrdersStatus())) {
//			// 话务员业绩信息
//			MedicalCallPerforAnalysis analysis = new MedicalCallPerforAnalysis();
//			analysis.setAdminId(admin.getId());
//			analysis.setOrdersId(orders.getId());
//			analysis.setAdminJobNum(admin.getUsername());
//			analysis.setAdminName(admin.getName());
//			if(!SystemConfig.SUPER_ADMIN.equals(admin.getIsSuper())) {
//				analysis.setGroupId(admin.getGroup().getId());
//				analysis.setGroupName(admin.getGroup().getName());
//				int userCount = this.iBaseDao.getIntCount("select count(*) from MedicalAdmin m where m.group.id = ? ", admin.getGroup().getId());
//				analysis.setUserCount(userCount);
//				analysis.setCenterId(admin.getGroup().getPlatform().getId());
//				analysis.setCenterName(admin.getGroup().getPlatform().getName());
//			}
//			analysis.setCommodityMoney(orders.getPayment());
//			analysis.setFreight(orders.getFreight());
//			analysis.settMoney(orders.getPayment().add(orders.getFreight()));
//			int productQuantity = this.iBaseDao.getIntCount("select count(*) from MedicalOrdersProduct m where m.ordersId = ? ", orders.getId());
//			analysis.setProductQuantity(productQuantity);
//			analysis.setHospitalId(orders.getHospitalId());
//			analysis.setOrdersTime(orders.getCreateTime());
//			this.iBaseDao.saveObject(analysis);
//		}
		
	}
	
	/**-----------------------------------------------------------------------订单生效切点----------------------------------------------------
	 * @desc 订单生效
	 * @author dangjh
	 * @datetime 2014年12月15日 上午4:00:55
	 */
	@Pointcut("execution(* com.fau.cm.service.impl.OrdersManagerServiceImpl.editOrdersStatus(..))")
	private void editOrdersStatus() {}
	
	/**
	 * @desc 订单生效
	 * @author dangjh
	 * @datetime 2014年12月11日 下午9:10:18
	 */
	@SuppressWarnings("unchecked")
	@AfterReturning("editOrdersStatus()")
	public void editOrdersStatus(JoinPoint joinPoint) {
		Object[] obj = joinPoint.getArgs();
		MedicalOrders orders = (MedicalOrders) obj[0];
		orders = (MedicalOrders) this.iBaseDao.getObject(MedicalOrders.class, orders.getId());
		MedicalAdmin admin = (MedicalAdmin) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		MedicalOrdersLog log = new MedicalOrdersLog();
		log.setOrderNo(orders.getSerialNum());
		log.setName(admin.getName());
		log.setUserName(admin.getUsername());
		log.setContent("订单生效");
		log.setEid(admin.getEnterpriseId());
		this.iBaseDao.saveObject(log);
		List<MedicalOrdersProduct> list = this.iBaseDao.getBySql("from MedicalOrdersProduct m where m.ordersId = ? ", null, orders.getId());
		for(MedicalOrdersProduct product : list) {
			List<MedicalMediaInfoCosts> mediaList = this.iBaseDao.getBySql("from MedicalMediaInfoCosts m where m.mediaId = ? and "
					+ "m.medicineId = ? order by m.createTime desc ", null, orders.getId(), product.getId());
			if(null != mediaList && mediaList.size() > 0) {
				MedicalMediaInfoCosts cost = mediaList.get(0);
				// 查询媒体投放信息对应的日进线数量
				int inNum = this.iBaseDao.getIntCount("select count(distinct m.callerNum) from MedicalCallCaller m where m.outsideNum = ? "
						+ " and m.callerTime >= ? ", cost.getPublishNumbers(), cost.getPutTime());
				cost.setInNum(inNum);
				// 计算日进线成本
				double dailyCost = cost.getCosts().doubleValue() / inNum;
				cost.setDailyCost(new BigDecimal(dailyCost));
				cost.setOrderNum(cost.getOrderNum()+1);
				// 订单成本 = 订单金额 / 进线数量    
				BigDecimal orderCost = orders.getPayment().add(orders.getFreight());
				double ordercost = orderCost.doubleValue() / inNum;
				cost.setOrderCost(new BigDecimal(ordercost));
				this.iBaseDao.saveObject(cost);
			}
		}
		
		// 话务员业绩信息
		MedicalCallPerforAnalysis analysis = new MedicalCallPerforAnalysis();
		analysis.setAdminId(admin.getId());
		analysis.setOrdersId(orders.getId());
		analysis.setAdminJobNum(admin.getUsername());
		analysis.setAdminName(admin.getName());
		if(!SystemConfig.SUPER_ADMIN.equals(admin.getIsSuper())) {
			analysis.setGroupId(admin.getGroup().getId());
			analysis.setGroupName(admin.getGroup().getName());
			int userCount = this.iBaseDao.getIntCount("select count(*) from MedicalAdmin m where m.group.id = ? ", admin.getGroup().getId());
			analysis.setUserCount(userCount);
			analysis.setCenterId(admin.getGroup().getPlatform().getId());
			analysis.setCenterName(admin.getGroup().getPlatform().getName());
		}
		analysis.setCommodityMoney(orders.getPayment());
		analysis.setFreight(orders.getFreight());
		analysis.settMoney(orders.getPayment().add(orders.getFreight()));
		int productQuantity = this.iBaseDao.getIntCount("select count(*) from MedicalOrdersProduct m where m.ordersId = ? ", orders.getId());
		analysis.setProductQuantity(productQuantity);
		analysis.setHospitalId(orders.getHospitalId());
		analysis.setOrdersTime(orders.getCreateTime());
		this.iBaseDao.saveObject(analysis);
	}
	
	
	/**
	 * @desc 更新记录
	 * @param callIds
	 * @author dangjh
	 * @datetime 2014年12月12日 上午11:30:09
	 */
	private void back(String callIds) {
		String[] ids = callIds.split(",");
		for(String id : ids) {
			this.iBaseDao.updateHql("delete from MedicalCallCheck m where m.taskId = ? and m.status <> ? ", id, SystemConfig.CALL_TASK_END);
			
			this.iBaseDao.updateHql("delete from MedicalCallTaskStatistics m where m.taskId = ? and m.taskType = ? ", id, SystemConfig.CALL_TASK_UNTREATED);
		}
	}
	
}
